<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="u9784bb10" id="u9784bb10"><br></p>
  <h1 data-lake-id="XaGI8" id="XaGI8"><span data-lake-id="uad0efae9" id="uad0efae9">典型回答</span></h1>
  <p data-lake-id="u689553ac" id="u689553ac"><br></p>
  <p data-lake-id="u364daa4d" id="u364daa4d"><span data-lake-id="uf89f599f" id="uf89f599f">Redis 发布订阅 (pub/sub) 是一种消息通信模式：发送者 (pub) 发送消息，订阅者 (sub) 接收消息。</span></p>
  <p data-lake-id="u65cfe869" id="u65cfe869"><span data-lake-id="u4e1e0d78" id="u4e1e0d78">​</span><br></p>
  <p data-lake-id="u539746ea" id="u539746ea"><span data-lake-id="u15cd674e" id="u15cd674e">（在Stream推出之后，越来越多人会采用Stream来实现这样的功能了。）</span></p>
  <p data-lake-id="u6298a1d6" id="u6298a1d6"><span data-lake-id="u5e9a5e09" id="u5e9a5e09">​</span><br></p>
  <p data-lake-id="u7a3717d4" id="u7a3717d4"><span data-lake-id="u5ab6b0b2" id="u5ab6b0b2">​</span><br></p>
  <p data-lake-id="u23ab8e4f" id="u23ab8e4f"><span data-lake-id="u2a61cb40" id="u2a61cb40">即在Redis中定义频道，客户端可以订阅一个或多个频道并接收它们所发布的消息。发布者向一个或多个频道发布消息，所有订阅该频道的客户端都会收到该消息。</span></p>
  <p data-lake-id="u8d56359b" id="u8d56359b"><span data-lake-id="ud687f95e" id="ud687f95e">​</span><br></p>
  <p data-lake-id="u69e2921c" id="u69e2921c"><span data-lake-id="u6336a7ed" id="u6336a7ed">​</span><br></p>
  <p data-lake-id="ue54f303c" id="ue54f303c" style="text-align: center"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1677995887004-70d82343-0fa8-41c6-8025-b6db1f8e49e6.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_34%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u5246d07e" id="u5246d07e" style="text-align: center"><br></p>
  <p data-lake-id="u914251f6" id="u914251f6" style="text-align: left"><span data-lake-id="u0153923d" id="u0153923d">Redis的发布/订阅模式一般用于实时消息传递和事件驱动的应用程序中，例如：</span></p>
  <p data-lake-id="u08d39ac8" id="u08d39ac8"><br></p>
  <ol list="u1037e2dd">
   <li fid="ub34a001b" data-lake-id="uac3b033b" id="uac3b033b"><strong><span data-lake-id="u796bed27" id="u796bed27">即时通讯</span></strong><span data-lake-id="ueefebfc2" id="ueefebfc2">：发布/订阅模式可以用于实现即时消息传递应用程序，例如聊天室或社交媒体应用程序。订阅者可以订阅特定频道以接收他们感兴趣的消息，并能够实时更新。</span></li>
  </ol>
  <p data-lake-id="u3a9625e7" id="u3a9625e7"><br></p>
  <ol list="u1037e2dd" start="2">
   <li fid="ub34a001b" data-lake-id="uaf31b148" id="uaf31b148"><strong><span data-lake-id="ua015b2a2" id="ua015b2a2">日志处理</span></strong><span data-lake-id="u977c2079" id="u977c2079">：发布/订阅模式可以用于日志处理应用程序，例如日志聚合或日志监控系统。订阅者可以订阅特定频道以接收他们感兴趣的日志消息，例如错误或异常消息，并能够实时更新。</span></li>
  </ol>
  <p data-lake-id="u340ad7d9" id="u340ad7d9"><br></p>
  <ol list="u1037e2dd" start="3">
   <li fid="ub34a001b" data-lake-id="u5985f7d0" id="u5985f7d0"><strong><span data-lake-id="u5ae59889" id="u5ae59889">实时数据更新</span></strong><span data-lake-id="u1dd991c8" id="u1dd991c8">：发布/订阅模式可以用于实时数据更新应用程序，例如股票市场或在线游戏。订阅者可以订阅特定频道以接收他们感兴趣的实时数据更新，并能够实时更新。</span></li>
  </ol>
  <p data-lake-id="ub95ddf67" id="ub95ddf67"><br></p>
  <ol list="u1037e2dd" start="4">
   <li fid="ub34a001b" data-lake-id="u5d6132a1" id="u5d6132a1"><strong><span data-lake-id="u78228ecc" id="u78228ecc">缓存刷新</span></strong><span data-lake-id="u1b9f9034" id="u1b9f9034">：发布/订阅模式可以用于缓存刷新应用程序，例如缓存的数据过期时自动更新。当数据被更新时，发布者将消息发布到特定频道，订阅者将接收到消息并更新其本地缓存。</span></li>
  </ol>
  <p data-lake-id="ubd124832" id="ubd124832" style="text-align: left"><span data-lake-id="u4ac89908" id="u4ac89908">​</span><br></p>
  <h1 data-lake-id="Q6i3L" id="Q6i3L"><span data-lake-id="u5e05b49b" id="u5e05b49b">扩展知识</span></h1>
  <p data-lake-id="u4bb76798" id="u4bb76798"><br></p>
  <h2 data-lake-id="ZxUkO" id="ZxUkO"><span data-lake-id="u25d9dfb1" id="u25d9dfb1">优缺点</span></h2>
  <p data-lake-id="uf04bb978" id="uf04bb978"><br></p>
  <p data-lake-id="u55ad348b" id="u55ad348b"><span data-lake-id="ud8d20884" id="ud8d20884">Redis的发布/订阅模式有以下优点和缺点：</span></p>
  <p data-lake-id="u7aa908a0" id="u7aa908a0"><span data-lake-id="ud5946958" id="ud5946958">优点：</span></p>
  <ol list="u1af05a7e">
   <li fid="uef238877" data-lake-id="u80120400" id="u80120400"><span data-lake-id="ud217ab16" id="ud217ab16">实时性高：发布/订阅模式可以实现实时消息传递，能够提高应用程序的实时性和响应速度。</span></li>
   <li fid="uef238877" data-lake-id="u1af5d047" id="u1af5d047"><span data-lake-id="u6eb6004a" id="u6eb6004a">灵活性高：发布/订阅模式可以根据需要订阅特定频道，订阅者只会接收他们感兴趣的消息，从而提高了灵活性。</span></li>
   <li fid="uef238877" data-lake-id="ua76d21ae" id="ua76d21ae"><span data-lake-id="u7d2510eb" id="u7d2510eb">可扩展性高：发布/订阅模式能够支持多个订阅者同时订阅特定频道，从而提高了可扩展性。</span></li>
  </ol>
  <p data-lake-id="u17cc3233" id="u17cc3233"><br></p>
  <p data-lake-id="uc7bcd96a" id="uc7bcd96a"><span data-lake-id="u59571be0" id="u59571be0">缺点：</span></p>
  <ol list="u0e715912">
   <li fid="u2e1e6d7d" data-lake-id="u2304a7b2" id="u2304a7b2"><span data-lake-id="u7f0f96fe" id="u7f0f96fe">可靠性低：发布/订阅模式是一种异步通信方式，发布者不会等待订阅者接收到消息，因此消息的可靠性可能会受到影响。</span></li>
   <li fid="u2e1e6d7d" data-lake-id="ue58aeffb" id="ue58aeffb"><span data-lake-id="u73067016" id="u73067016">可靠性难以保证：发布/订阅模式在传输过程中可能会出现消息丢失的情况，尤其是在高负载情况下。</span></li>
   <li fid="u2e1e6d7d" data-lake-id="ua70d0505" id="ua70d0505"><span data-lake-id="ua24a5a85" id="ua24a5a85">不适合高频次的请求：在高频次的请求场景下，发布/订阅模式可能会对性能造成影响，因为每个订阅者都需要对每个发布的消息进行处理。</span></li>
  </ol>
  <p data-lake-id="udd08efcc" id="udd08efcc"><br></p>
  <h2 data-lake-id="RJV2T" id="RJV2T"><span data-lake-id="u51a5babe" id="u51a5babe">用法</span></h2>
  <p data-lake-id="u16a7e125" id="u16a7e125" style="text-align: left"><span data-lake-id="ud0846ee2" id="ud0846ee2"><br></span><span data-lake-id="u70479f67" id="u70479f67"> 具体的实现过程如下：</span></p>
  <p data-lake-id="u65d2d78e" id="u65d2d78e" style="text-align: left"><span data-lake-id="u9b1ab20e" id="u9b1ab20e">​</span><br></p>
  <p data-lake-id="ub2f446cd" id="ub2f446cd" style="text-align: left"><span data-lake-id="u1ab71aa9" id="u1ab71aa9">1、创建并发布消息到一个Redis频道：</span></p>
  <p data-lake-id="u2041a9ff" id="u2041a9ff" style="text-align: left"><span data-lake-id="ucafce3aa" id="ucafce3aa">​</span><br></p>
  <pre lang="java"><code>
redis-cli&gt; PUBLISH channel1 "Hello, world!"
</code></pre>
  <p data-lake-id="ubf59ddca" id="ubf59ddca"><br></p>
  <p data-lake-id="u10a807e0" id="u10a807e0"><span data-lake-id="u46e5b654" id="u46e5b654">2、客户端订阅渠道的消息</span></p>
  <p data-lake-id="ucde61967" id="ucde61967"><span data-lake-id="u25158849" id="u25158849">​</span><br></p>
  <pre lang="java"><code>
redis-cli&gt; SUBSCRIBE channel1
</code></pre>
  <p data-lake-id="u1070996d" id="u1070996d"><br></p>
  <p data-lake-id="udcd0f82c" id="udcd0f82c"><span data-lake-id="ube01aba3" id="ube01aba3">订阅后，客户端将一直保持订阅状态，直到手动取消订阅或者连接断开。</span></p>
  <p data-lake-id="u75e561c5" id="u75e561c5"><span data-lake-id="ub7a23f23" id="ub7a23f23">​</span><br></p>
  <p data-lake-id="ud034f6a6" id="ud034f6a6"><span data-lake-id="ub464734b" id="ub464734b">可以通过在不同的客户端上运行相同的订阅命令来实现多个订阅者，它们都会接收到频道中发布的消息。</span></p>
  <p data-lake-id="ud9cdd2d9" id="ud9cdd2d9"><span data-lake-id="u3dad27ef" id="u3dad27ef">​</span><br></p>
  <p data-lake-id="u09ea686a" id="u09ea686a"><strong><span data-lake-id="u51853154" id="u51853154">Redis发布/订阅模式是异步的</span></strong><span data-lake-id="u8873f227" id="u8873f227">，即发布者不会等待订阅者接收到消息。此外，Redis还提供了许多其他功能，例如模式匹配和非阻塞订阅等。</span></p>
 </body>
</html>